package com.rzcode.coinex.kernel.dao.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.rzcode.coinex.kernel.common.enums.*;
import com.rzcode.coinex.kernel.domain.Alipay;
import com.rzcode.coinex.kernel.domain.BankInfo;
import com.rzcode.coinex.kernel.domain.Location;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 会员实体类，用于存储会员的详细信息和状态。
 *
 * @author Bridge.Xu
 * @date 2020年01月02日
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "member")
public class Member {
    /**
     * 会员编号，唯一标识会员的ID。
     *
     * @ApiModelProperty 注解用于文档化字段的描述和示例值。
     */
    @ApiModelProperty(value = "会员编号", example = "1")
    private Long id;

    /**
     * 盐值，用于密码加密。
     */
    @ApiModelProperty(value = "盐值，用于密码加密。")
    private String salt;

    /**
     * 会员用户名，登录系统的唯一标识。
     */
    @ApiModelProperty(value = "会员用户名，登录系统的唯一标识。")
    private String username;

    /**
     * 登录密码，用于会员登录系统。
     */
    @ApiModelProperty(value = "登录密码", example = "password123")
    private String password;

    /**
     * 是否缴纳保证金，标识会员是否已缴纳保证金。
     */
    @ApiModelProperty(value = "是否缴纳保证金", example = "true")
    private String margin;

    /**
     * Google验证密钥，用于双因素认证。
     */
    @ApiModelProperty(value = "Google验证密钥", example = "ABCD1234")
    private String googleKey;

    /**
     * Google验证状态，标识Google验证是否启用。
     */
    @ApiModelProperty(value = "Google验证状态", example = "1")
    private Integer googleState;

    /**
     * Google验证日期，记录Google验证的启用日期。
     */
    @ApiModelProperty(value = "Google验证日期", example = "2023-01-01 12:00:00")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime googleDate;

    /**
     * 交易密码，用于执行敏感操作时的身份验证。
     */
    @ApiModelProperty(value = "交易密码", example = "tradePassword123")
    private String jyPassword;

    /**
     * 会员真实姓名，会员的法定姓名。
     */
    @ApiModelProperty(value = "会员真实姓名", example = "张三")
    private String realName;

    /**
     * 身份证号码，会员的个人身份证明号码。
     */
    @ApiModelProperty(value = "身份证号码", example = "123456789012345678")
    private String idNumber;

    /**
     * 邮箱，会员的电子邮箱地址。
     */
    @ApiModelProperty(value = "邮箱", example = "user@example.com")
    private String email;

    /**
     * 手机号，会员的联系电话号码。
     */
    @ApiModelProperty(value = "手机号", example = "13800138000")
    private String mobilePhone;

    /**
     * 位置信息，会员的地理位置信息。
     */
    @ApiModelProperty(value = "位置信息，会员的地理位置信息。")
    private Location location;

    /**
     * 会员等级，标识会员的等级状态。
     */
    @ApiModelProperty(value = "会员等级，标识会员的等级状态。")
    private MemberLevelEnum memberLevel;

    /**
     * 状态，标识会员的当前状态（正常、冻结等）。
     */
    @ApiModelProperty(value = "状态", example = "NORMAL")
    private CommonStateEnum status = CommonStateEnum.NORMAL;


    /**
     * 注册时间，会员账户的创建时间。
     */
    @ApiModelProperty(value = "注册时间", example = "2023-01-01 12:00:00")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime registrationTime;

    /**
     * 最后登录时间，会员最近一次登录的时间。
     */
    @ApiModelProperty(value = "最后登录时间", example = "2023-01-01 12:00:00")
    private LocalDateTime lastLoginTime;


    /**
     * 会话令牌，用于保持会员登录状态的令牌。
     */
    @ApiModelProperty(value = "会话令牌", example = "eyJhbGciOiJ")
    private String token;


    /**
     * 超级合伙人标识，标识会员是否为超级合伙人。
     */
    @ApiModelProperty(value = "超级合伙人标识", example = "0")
    private String superPartner = "0";

    /**
     * 交易次数，会员进行的交易次数统计。
     */
    @ApiModelProperty(value = "交易次数", example = "10")
    private int transactions = 0;

    /**
     * 银行信息，会员的银行账户信息。
     */
    @ApiModelProperty(value = "银行信息")
    private BankInfo bankInfo;

    /**
     * 支付宝信息，会员的支付宝账户信息。
     */
    @ApiModelProperty(value = "支付宝信息")
    private Alipay alipay;


    /**
     * 微信支付信息，会员的微信支付账户信息。
     */
    @ApiModelProperty(value = "微信支付信息")
    private WechatPay wechatPay;

    /**
     * 申诉次数，会员的申诉次数统计。
     */
    @ApiModelProperty(value = "申诉次数", example = "2")
    private int appealTimes = 0;

    /**
     * 胜诉次数，会员的胜诉次数统计。
     */
    @ApiModelProperty(value = "胜诉次数", example = "1")
    private int appealSuccessTimes = 0;

    /**
     * 邀请者ID，邀请该会员加入的会员ID。
     */
    @ApiModelProperty(value = "邀请者ID", example = "10001")
    private Long inviterId;

    /**
     * 推广码，会员的推广码，用于跟踪推荐来源。
     */
    @ApiModelProperty(value = "推广码", example = "PROMO123")
    private String promotionCode;


    /**
     * 第一级下线数量，会员直接邀请的第一层级会员数量。
     */
    @ApiModelProperty(value = "第一级下线数量", example = "5")
    private int firstLevel = 0;


    /**
     * 第二级下线数量，会员间接邀请的第二层级会员数量。
     */
    @ApiModelProperty(value = "第二级下线数量", example = "10")
    private int secondLevel = 0;

    /**
     * 第三级下线数量，会员间接邀请的第三层级会员数量。
     */
    @ApiModelProperty(value = "第三级下线数量", example = "15")
    private int thirdLevel = 0;

    /**
     * 国家信息，会员所在国家的信息。
     */
    @ApiModelProperty(name = "local")
    private Country country;
    /**
     * 实名认证状态
     */
    /**
     * 实名认证状态，会员的实名认证状态。
     */
    @ApiModelProperty(value = "实名认证状态", example = "NOT_CERTIFIED")
    private RealNameStateEnum realNameStatus = RealNameStateEnum.NOT_CERTIFIED;

    /**
     * 登录次数，会员的登录次数统计。
     */
    @ApiModelProperty(value = "登录次数", example = "50")
    private int loginCount = 0;

    /**
     * 认证商家状态
     */
    @ApiModelProperty(value = "认证商家状态", example = "50")
    private CertBizStateEnum certifiedBusinessStatus = CertBizStateEnum.NOT_CERTIFIED;

    /**
     * 认证商家申请时间
     */
    @ApiModelProperty(value = "认证商家申请时间")
    private LocalDateTime certifiedBusinessApplyTime;

    /**
     * 实名认证通过时间
     */
    @ApiModelProperty(value = "实名认证通过时间")
    private LocalDateTime applicationTime;


    /**
     * 商家审核通过时间
     */
    @ApiModelProperty(value = "商家审核通过时间")
    private LocalDateTime certifiedBusinessCheckTime;


    /**
     * 头像
     */
    @ApiModelProperty(value = "头像")
    private String avatar;

    /**
     * Token预计过期时间
     */
    @ApiModelProperty(value = "Token预计过期时间")
    private LocalDateTime tokenExpireTime;

    /**
     * 发布广告:1表示可以发布
     */
    @ApiModelProperty(value = "发布广告:1表示可以发布")
    private BooleanEnum publishAdvertise = BooleanEnum.IS_TRUE;

    /**
     * 0:表示禁止交易
     */
    @ApiModelProperty(value = "0:表示禁止交易")
    private BooleanEnum transactionStatus = BooleanEnum.IS_TRUE;

    /**
     * 签到能力
     */
    @ApiModelProperty(value = "签到能力")
    private Boolean signInAbility = true;
}